#include "Test.h"
#include "utils/FileSystem.h"
#include <iostream>
#include <fstream>
#include <sstream>


void Test::leerParticion(const int partMax, std::string directorio){
	int cant = 1;
	do {
		std::cout << "\nIndique el nro de partición a leer (1 - " << partMax << "), '0' para salir\n>> ";
		std::cin >> cant;

		if (cant >0 && cant <= partMax){

			std::string nombre = FileSystem::getNombreParticion(cant);
			if (directorio != "") nombre = directorio + "/" + nombre;

			std::ifstream fin(nombre.c_str(), std::ifstream::in | std::ifstream::binary);
			if (fin.good()){

				std::cout << nombre << ":" << std::endl;
				while (!fin.eof()){
					PalabraAleatoria test;
					test.cargarPalabra(fin);

					// Evita que imprima una linea vacia
					if (!fin.eof()){
						std::cout << "\t-> " << test.getIdentificador()
								<< " ==> " << test.getPalabra() << std::endl;
					}
				}

			} else {
				std::cout << "No existe " << nombre << std::endl;
			}

			fin.close();
		}

	} while (cant > 0 && cant <= partMax);
}


void Test::leerFusion(const int nroMaxArch, int etapa){
	int cant = 1;
	do {
		std::cout << "\nEtapa " << etapa << "\nIndique el nro del archivo de fusion a leer (1 - " << nroMaxArch << "), '0' para salir\n>> ";
		std::cin >> cant;

		if (cant >0 && cant <= nroMaxArch){

			std::string nombre = FileSystem::getNombreFusion(cant, etapa);

			std::ifstream fin(nombre.c_str(), std::ifstream::in | std::ifstream::binary);
			if (fin.good()){

				std::cout << nombre << ":" << std::endl;
				while (!fin.eof()){
					PalabraAleatoria test;
					test.cargarPalabra(fin);

					// Evita que salga una linea en blanco
					if (!fin.eof()){
						std::cout << "\t-> " << test.getIdentificador()
								<< " ==> " << test.getPalabra() << std::endl;
					}
				}

			} else {
				std::cout << "No existe " << nombre << std::endl;
			}

			fin.close();
		}

	} while (cant > 0 && cant <= nroMaxArch);
}


void Test::imprimirBuffer(const Buffer<PalabraAleatoria> &buff, std::string titulo){
	if (titulo == ""){
		titulo = "El contenido del buffer es:";
	}
	std::cout << "\n" << titulo << std::endl;

	for (int i = 0; i < buff.getCantElem(); ++i){
		PalabraAleatoria p = buff.verElemento(i);
		std::cout << "\t-> " << p.getIdentificador() << " == " << p.getPalabra() << std::endl;
	}
}


void Test::imprimirHeap(const Heap<PalabraAleatoria> &heap){
	std::cout << "No implementado" << std::endl;
}


void Test::leerResultado(std::string nomArch){
	std::cout << "¿Desea ver el contenido de archivo resultado? (s/n) \n>> ";
	char c = '\0';
	std::cin >> c;

	if (c == 's' || c == 'S'){
		std::ifstream fin(nomArch.c_str(), std::ifstream::in | std::ifstream::binary);
		if (fin.good()){

			while (!fin.eof()){
				PalabraAleatoria test;
				test.cargarPalabra(fin);

				// Evita que salga una linea en blanco
				if (!fin.eof()){
					std::cout << "\t-> " << test.getIdentificador()
							<< " ==> " << test.getPalabra() << std::endl;
				}
			}

		} else {
			std::cout << "Error al abrir el archivo " << nomArch << std::endl;
		}

		fin.close();
	}
}
